package com.gui.admin;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import com.controller.AdminCon;
import com.controller.BugCon;
import com.gui.baseframe.BaseFrame;
import com.gui.login.LoginAll;
import com.tool.DatabaseTool;

public class AdminFrame extends BaseFrame {
	private String bname = ""; // 表格中被选中的数据的书名
	private String bid; // 表格中被选中的数据的编号
	private int bnum; // 被删除的数量
	private JTable jtab = null;
	// 网格布局属性
	private static final int GRID_ROWS = 6;
	private static final int GRID_COLS = 2;
	// 文本框长度
	private static final int TEXT_COLUMNS = 14;
	// 边框距离
	private static final int BORDER_LENGTH = 20;
	// 下拉列表框的下标
	private int i1, i2, i3;
	// 三个下拉列表框
	private JComboBox<String> jcb8;
	private JComboBox<String> jcb9;
	private JComboBox<String> jcb10;
	// 书架编号
	private String str = "";
	// 判断文本框是否为日期和数值
	private static boolean isbug = false;
	public String tf;
	public String tab;
	public String jtab_name;

	public AdminFrame() {

		// 创建总布局：边框布局

		this.setLayout(new BorderLayout());
		// 创建顶部容器
		JTabbedPane jfTop = createJFTop();
		// 加载顶部容器
		this.add(jfTop, BorderLayout.CENTER);
		init();
		// 覆盖标题
		setTitle("管理员界面");
	}

	/**
	 * 选项卡
	 * 
	 * @return
	 */
	private JTabbedPane createJFTop() {
		// 创建选项卡容器
		JTabbedPane jtp = new JTabbedPane(JTabbedPane.TOP);
		jtp.setBorder(new EmptyBorder(BORDER_LENGTH, BORDER_LENGTH, BORDER_LENGTH, BORDER_LENGTH));
		// 创建2个选项卡
		JPanel jp1 = createJP1();
		JPanel jp2 = createJP2();

		// 加载选项卡
		jtp.add("查询书籍", jp1);
		jtp.add("添加书籍", jp2);
		return jtp;
	}

	// 内部类，监听器：用于监听下拉列表框的选中时间
	class ActionJCB implements ItemListener {
		@Override
		public void itemStateChanged(ItemEvent e) {
			// 如果选中，就获取选中的下标值
			if (e.getStateChange() == ItemEvent.SELECTED) {
				// 其中，默认是空白，所以不取0的下标
				if (e.getSource() == jcb8 && jcb8.getSelectedIndex() > 0) {
					i1 = jcb8.getSelectedIndex();
				} else if (e.getSource() == jcb9 && jcb9.getSelectedIndex() > 0) {
					i2 = jcb9.getSelectedIndex();
				} else if (e.getSource() == jcb10 && jcb10.getSelectedIndex() > 0) {
					i3 = jcb10.getSelectedIndex();
					// 获取书架编号，如果书架编号是个位数就前面加0
					if (0 <= i3 && i3 < 10) {
						str = "0" + i3;
					} else {
						str = "" + i3;
					}
				}

			}
		}
	}

	/**
	 * 插入书籍
	 * 
	 * @return
	 */
	private JPanel createJP2() {
		// 书架数量
		final int num = 15;
		// 创建总容器
		JPanel basejp = new JPanel();
		basejp.setLayout(new BorderLayout());
		// 创建一个顶部容器
		JPanel topjp = new JPanel();
		JLabel jlab = new JLabel("欢迎登陆图书管理系统——新增书籍");
		topjp.add(jlab);
		// 创建一个中间容器
		JPanel cneterjp = new JPanel();
		cneterjp.setLayout(new GridLayout(GRID_ROWS, GRID_COLS));
		// 创建一个组，用来存放一个标签和一个文本框
		// 组1
		JPanel jp_rows1 = new JPanel();
		JLabel jl1 = new JLabel("编　号　：");
		JTextField jtf1 = new JTextField(TEXT_COLUMNS);
		jtf1.setEnabled(false);
		JLabel jl1_1 = new JLabel("注：图书编号由楼号/房间号/书架号组成");
		jp_rows1.add(jl1);
		jp_rows1.add(jtf1);
		jp_rows1.add(jl1_1);
		// 组2
		JPanel jp_rows2 = new JPanel();
		JLabel jl2 = new JLabel("名　称　：");
		JTextField jtf2 = new JTextField(TEXT_COLUMNS);
		jp_rows2.add(jl2);
		jp_rows2.add(jtf2);
		jtf2.addMouseListener(new MouseListener() {
			@Override
			public void mouseReleased(MouseEvent e) {
			}

			@Override
			public void mousePressed(MouseEvent e) {
				jl2.setForeground(Color.black);
			}

			@Override
			public void mouseExited(MouseEvent e) {
			}

			@Override
			public void mouseEntered(MouseEvent e) {
			}

			@Override
			public void mouseClicked(MouseEvent e) {
			}
		});
		// 组3
		JPanel jp_rows3 = new JPanel();
		JLabel jl3 = new JLabel("类　别　：");
		JTextField jtf3 = new JTextField(TEXT_COLUMNS);
		jp_rows3.add(jl3);
		jp_rows3.add(jtf3);
		// 组4
		JPanel jp_rows4 = new JPanel();
		JLabel jl4 = new JLabel("价　格　：");
		JTextField jtf4 = new JTextField(TEXT_COLUMNS);
		jp_rows4.add(jl4);
		jp_rows4.add(jtf4);
		ActionBug(jtf4, jl4);
		// 组5
		JPanel jp_rows5 = new JPanel();
		JLabel jl5 = new JLabel("数　量　：");
		JTextField jtf5 = new JTextField(TEXT_COLUMNS);
		jp_rows5.add(jl5);
		jp_rows5.add(jtf5);
		ActionBug(jtf5, jl5);
		// 组6
		JPanel jp_rows6 = new JPanel();
		JLabel jl6 = new JLabel("出版社　：");
		JTextField jtf6 = new JTextField(TEXT_COLUMNS);
		jp_rows6.add(jl6);
		jp_rows6.add(jtf6);
		// 组7
		JPanel jp_rows7 = new JPanel();
		JLabel jl7 = new JLabel("入库时间：");
		JTextField jtf7 = new JTextField(TEXT_COLUMNS);
		jp_rows7.add(jl7);
		jp_rows7.add(jtf7);
		ActionBug(jtf7, jl7);
		// 组8
		JPanel jp_rows8 = new JPanel();
		JLabel jl8 = new JLabel("楼层号　：");
		jcb8 = new JComboBox<String>();
		jcb8.addItem("　　　　　　　　　　");
		jcb8.addItem("1楼　　　　　　　 　");
		jcb8.addItem("2楼　　　　　　　 　");
		jcb8.addItem("3楼　　　　　　　 　");
		jp_rows8.add(jl8);
		jp_rows8.add(jcb8);
		// 组9
		JPanel jp_rows9 = new JPanel();
		JLabel jl9 = new JLabel("房间号　：");
		jcb9 = new JComboBox<String>();
		jcb9.addItem("　　　　　　　　　　");
		jcb9.addItem("房间1　　　　　　 　");
		jcb9.addItem("房间2　　　　　　 　");
		jp_rows9.add(jl9);
		jp_rows9.add(jcb9);
		// 组10
		JPanel jp_rows10 = new JPanel();
		JLabel jl10 = new JLabel("书架号　：");
		jcb10 = new JComboBox<String>();
		jcb10.addItem("　　　　　　　　　　");
		for (int i = 1; i <= num; i++) {
			jcb10.addItem(i + "号书架　　　　　 　");
		}
		jp_rows10.add(jl10);
		jp_rows10.add(jcb10);
		// 添加所有组
		cneterjp.add(jp_rows1);
		cneterjp.add(jp_rows2);
		cneterjp.add(jp_rows3);
		cneterjp.add(jp_rows4);
		cneterjp.add(jp_rows5);
		cneterjp.add(jp_rows6);
		cneterjp.add(jp_rows7);
		cneterjp.add(jp_rows8);
		cneterjp.add(jp_rows9);
		cneterjp.add(jp_rows10);
		JButton jb = new JButton("添加");
		// 下拉列表框的选中事件
		jcb8.addItemListener(new ActionJCB());
		jcb9.addItemListener(new ActionJCB());
		jcb10.addItemListener(new ActionJCB());
		// 鼠标的单击事件
		jb.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 判断如果数量的文本框没有填写内容，则弹出对话框报错
				if ("".equals(jtf5.getText()) || jtf5.getText() == null) {
					JOptionPane.showMessageDialog(null, "你必须输入添加的数量");
					return;
				}
				if (isbug) {
					JOptionPane.showMessageDialog(null, "你必须输入正确的内容");
					return;
				}
				if (jtf2.getText() == null || "".equals(jtf2.getText())) {
					jl2.setForeground(Color.RED);
					JOptionPane.showMessageDialog(null, "书名不能为空");
					return;
				}
				// 获取输入的书的数量
				int book_num = Integer.parseInt(jtf5.getText());
				if (i1 == 0 || i2 == 0 || str == "00") {
					JOptionPane.showMessageDialog(null, "编号生产失败，必须选择楼层号/房间号/书架号");
					return;
				}
				jtf1.setText("" + i1 + i2 + str);
				String[] arr = { jtf2.getText(), // 名字
						jtf3.getText(), // 类型
						jtf4.getText(), // 价格
						jtf6.getText(), // 出版社
						jtf7.getText() // 入库时间
				};
				// 调用插入方法
				String res = AdminCon.insert(arr, book_num, jtf1);
				JOptionPane.showMessageDialog(null, res);
			}
		});
		// 添加到总布局中
		basejp.add(topjp, BorderLayout.NORTH);
		basejp.add(cneterjp, BorderLayout.CENTER);
		basejp.add(jb, BorderLayout.SOUTH);
		return basejp;
	}

	/**
	 * 查询
	 * 
	 * @return JPanel
	 */
	private JPanel createJP1() {
		// 设置一个总容器
		JPanel jp = new JPanel();
		jp.setLayout(new BorderLayout());
		// 创建一个顶部容器
		JPanel topjp = new JPanel();
		JLabel jlab = new JLabel("欢迎登陆图书管理系统——查询信息");
		topjp.add(jlab);
		// 创建一个中间容器
		JPanel centerjp = new JPanel();
		centerjp.setLayout(new GridLayout(GRID_ROWS, GRID_COLS));
		// 创建一个组，用来存放一个标签和一个文本框
		// 组1
		JPanel jp_rows1 = new JPanel();
		JLabel jl1 = new JLabel("编　号　：");
		JTextField jtf1 = new JTextField(TEXT_COLUMNS);
		jp_rows1.add(jl1);
		jp_rows1.add(jtf1);
		ActionBug(jtf1, jl1);
		// 组2
		JPanel jp_rows2 = new JPanel();
		JLabel jl2 = new JLabel("名　称　：");
		JTextField jtf2 = new JTextField(TEXT_COLUMNS);
		jp_rows2.add(jl2);
		jp_rows2.add(jtf2);
		// 组3
		JPanel jp_rows3 = new JPanel();
		JLabel jl3 = new JLabel("类　别　：");
		JTextField jtf3 = new JTextField(TEXT_COLUMNS);
		jp_rows3.add(jl3);
		jp_rows3.add(jtf3);
		// 组4
		JPanel jp_rows4 = new JPanel();
		JLabel jl4 = new JLabel("价　格　：");
		JTextField jtf4 = new JTextField(TEXT_COLUMNS);
		jp_rows4.add(jl4);
		jp_rows4.add(jtf4);
		ActionBug(jtf4, jl4);
		// 组5
		JPanel jp_rows5 = new JPanel();
		JLabel jl5 = new JLabel("数　量　：");
		JTextField jtf5 = new JTextField(TEXT_COLUMNS);
		jp_rows5.add(jl5);
		jp_rows5.add(jtf5);
		ActionBug(jtf5, jl5);
		// 组6
		JPanel jp_rows6 = new JPanel();
		JLabel jl6 = new JLabel("出版社　：");
		JTextField jtf6 = new JTextField(TEXT_COLUMNS);
		jp_rows6.add(jl6);
		jp_rows6.add(jtf6);
		// 组7
		JPanel jp_rows7 = new JPanel();
		JLabel jl7 = new JLabel("入库时间：");
		JTextField jtf7 = new JTextField(TEXT_COLUMNS);
		jp_rows7.add(jl7);
		jp_rows7.add(jtf7);
		ActionBug(jtf7, jl7);
		// 组8
		JPanel jp_com = new JPanel();
		JComboBox<String> jcom = new JComboBox<>();
		jcom.addItem("删除单个");
		jcom.addItem("删除全部");
		JButton jbdel = new JButton("删除");
		JButton jb2 = new JButton("修改"); // 修改信息按钮
		JButton jb3 = new JButton("勾选");
		jp_com.add(jb3);
		jp_com.add(jb2);
		jp_com.add(jcom);
		jp_com.add(jbdel);
		// 勾选按钮的监听器
		jb3.addActionListener(new ClickAc());
		// 显示修改页面的监听器
		jb2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (!(bname.equals(""))) {
					new AlterAdmin(bname);
				}
			}
		});
		// 删除按钮的监听器
		jbdel.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				new JOptionPane();
				String sqls = null;
				// 产生系统当前时间
				String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
				// 如果选中的是删除单个，则只删除一条语句，否则删除全部
				int is_delete = JOptionPane.showConfirmDialog(null, "是否删除");
				if (is_delete == 0) {
					if (jcom.getSelectedIndex() == 0) {
						bnum = 1;
						sqls = "DELETE from book where b_id='" + bid + "'";
					} else {
						String selectsql = "select count(*) from book where b_name='" + bname + "'";
						try {
							bnum = DatabaseTool.getNum(selectsql);
						} catch (SQLException e) {
							e.printStackTrace();
						}
						sqls = "DELETE from book where b_name='" + bname + "'";
					}
				}
				// 向info表里插入一条修改语句
				String deletesql = "insert into info(i_title,i_content,i_date,a_name) values('修改图书'," + "'修改了" + bnum
						+ "本" + bname + "','" + date + "','" + LoginAll.getUser() + "')";
				DatabaseTool.doDelete(sqls);
				DatabaseTool.doInsert(deletesql);
			}
		});
		// 添加所有控件
		centerjp.add(jp_rows1);
		centerjp.add(jp_rows2);
		centerjp.add(jp_rows3);
		centerjp.add(jp_rows4);
		centerjp.add(jp_rows5);
		centerjp.add(jp_rows6);
		centerjp.add(jp_rows7);
		centerjp.add(jp_com);
		// 创建底部容器
		JPanel botjp = new JPanel();
		botjp.setLayout(new BorderLayout());
		JButton jb = new JButton("查询");
		jb.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 你必须输入正确的内容
				if (isbug) {
					JOptionPane.showMessageDialog(null, "你必须输入正确的内容");
					return;
				}
				// 文本框的内容
				JTextField[] jtf = { jtf1, jtf2, jtf3, jtf4, jtf5, jtf6, jtf7 };
				// Sql的字段名
				String[] jl = { "b_id", "b_name", "b_type", "b_price", "b_num", "b_company", "b_indate" };
				// 用Map集合获取文本框的内容与Sql的字段名一一对应，并去除前后的空格
				Map<String, String> maptt = new HashMap<>();
				for (int i = 0; i < jtf.length; i++) {
					// 判断前提，不是空的情况下
					if (!"".equals(jtf[i].getText().trim())) {
						maptt.put(jl[i], jtf[i].getText().trim());
					}
				}
				// 删除底部布局
				botjp.removeAll();
				// 新建一个表格接受查询语句的返回的表格
				jtab = AdminCon.select(maptt);
				// 添加滚动条
				JScrollPane jsp = new JScrollPane(jtab);
				// 设置滚动条的大小
				Dimension ds = new Dimension(500, 240);
				jsp.setPreferredSize(ds);
				// 底部布局添加控件并刷新布局
				botjp.add(jsp, BorderLayout.NORTH);
				botjp.add(jb, BorderLayout.SOUTH);
				botjp.updateUI();

			}
		});
		botjp.add(jb, BorderLayout.SOUTH);
		// 添加所有组
		jp.add(topjp, BorderLayout.NORTH);
		jp.add(centerjp, BorderLayout.SOUTH);
		jp.add(botjp, BorderLayout.CENTER);
		return jp;
	}

	/**
	 * 数字和日期文本框的正则判断
	 * 
	 * @param jtf
	 *            获取文本框
	 * @param jl
	 *            获取标签
	 * @return
	 */
	public static void ActionBug(JTextField jtf, JLabel jl) {

		jtf.addKeyListener(new KeyListener() {
			@Override
			public void keyTyped(KeyEvent e) {
			}

			@Override
			public void keyReleased(KeyEvent e) {
			}

			@Override
			public void keyPressed(KeyEvent e) {
				// 调用BugCon的actionBug方法，将文本框，标签，以及标签的文字内容取出来
				isbug = BugCon.actionBug(jtf, jl, jl.getText().replaceAll("　| |：", ""));
			}
		});
	}

	/**
	 * 选中表格的监听器
	 * 
	 * @author Administrator
	 *
	 */
	class ClickAc implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			String sql = "select count(*) from book";
			int num = 0;
			try {
				num = DatabaseTool.getNum(sql);
			} catch (SQLException e1) {
			}
			// 先进行SQL Count（*）查找，如果数据库为空，则提示错误
			if (num <= 0) {
				JOptionPane.showMessageDialog(null, "数据表已空，无法勾选");
				return;
			}
			if (((JButton) e.getSource()).getLabel().equals("勾选")) {
				int index = 0;
				index = jtab.getSelectedRow();
				try {
					bid = (String) jtab.getValueAt(index, 0);
					bname = (String) jtab.getValueAt(index, 1);
				} catch (ArrayIndexOutOfBoundsException array) {
					JOptionPane.showMessageDialog(null, "请选择表格中的值", "警告", JOptionPane.WARNING_MESSAGE);
					return;
				}
			}
		}
	}
}
